import logging
from typing import Dict, Optional, Union
from app.core.config import settings


def setup_logging(module_levels: Optional[Dict[str, Union[str, int]]] = None):
    """
    配置应用日志系统
    
    Args:
        module_levels: 可选，模块级别的日志级别配置字典，格式为 {模块名: 日志级别}
                      例如: {"app.api": "DEBUG", "app.db": "INFO"}
    """
    # 配置根日志记录器
    logging.basicConfig(
        level=getattr(logging, settings.LOG_LEVEL),
        format='%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s',
        force=True  # 确保日志配置不会被覆盖
    )
    
    # 如果提供了模块级别的日志配置，则应用这些配置
    if module_levels:
        for module_name, level in module_levels.items():
            module_logger = logging.getLogger(module_name)
            if isinstance(level, str):
                module_logger.setLevel(getattr(logging, level))
            else:
                module_logger.setLevel(level)
    
    # 获取根日志记录器并返回
    logger = logging.getLogger(__name__)
    logger.info("日志系统已初始化，日志级别: %s", settings.LOG_LEVEL)
    
    return logger


# 设置特定模块的日志级别
def set_module_log_level(module_name: str, level: Union[str, int]):
    """
    为特定模块设置日志级别
    
    Args:
        module_name: 模块名称，例如 "app.api"
        level: 日志级别，可以是字符串("DEBUG", "INFO"等)或整数(logging.DEBUG等)
    """
    module_logger = logging.getLogger(module_name)
    if isinstance(level, str):
        module_logger.setLevel(getattr(logging, level))
    else:
        module_logger.setLevel(level)
    logger.info("模块 %s 的日志级别已设置为 %s", module_name, level)


# 预配置的日志记录器，可以在其他模块中导入使用
logger = setup_logging()